package com.anbang.app.ui.animation

import android.content.Intent
import android.os.Build
import android.os.Bundle
import android.transition.Explode
import android.transition.Fade
import android.transition.Slide
import android.view.View
import android.view.ViewAnimationUtils
import android.view.Window
import android.view.animation.AccelerateInterpolator
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityOptionsCompat
import androidx.core.util.Pair
import com.anbang.app.R
import kotlinx.android.synthetic.main.activity_material_design_anim.*

/**
 * MaterialDesign 动画相关
 */
class MaterialDesignAnimActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //todo 改行代码必须在 setContentView 之前设置
        window.requestFeature(Window.FEATURE_CONTENT_TRANSITIONS)

        setContentView(R.layout.activity_material_design_anim)

        //设置toolsBar
        setSupportActionBar(toolbar)

        revealBtn.setOnClickListener {
            //圆形水波纹 揭露-Reveal 效果
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                ViewAnimationUtils.createCircularReveal(it, it.width / 2, it.height / 2, 0f, it.height.toFloat()).apply {
                    //设置加速器
                    interpolator = AccelerateInterpolator()
                    duration = 500
                    start()
                }
            }
        }

        revealBtn1.setOnClickListener {
            //圆形水波纹 揭露-Reveal 效果 从左上角
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                //参数:View  中心点坐标x 中心点坐标y 开始扩散初始半径(不一定非从没有开始)  扩散结束半径
                //Math.hypot 勾股定理 计算结束半径
                ViewAnimationUtils.createCircularReveal(it, 0, 0, 0f, Math.hypot(it.width.toDouble(), it.height.toDouble()).toFloat()).apply {
                    //设置加速器
                    interpolator = AccelerateInterpolator()
                    duration = 500
                    start()
                }
            }
        }

        nextBtn1.setOnClickListener {
            startActivity(Intent(this@MaterialDesignAnimActivity, ToSecondActivity::class.java))
            //一般动画(需要在下一个Activity finish 时 也复写动画 来实现 进入退出的动画 -- 2.0版本的动画)
            overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out)
        }

        //共享元素
        imageView.setOnClickListener {
            //设置允许使用转场动画  或者 在style中 修改主题：<item name="android:windowContentTransitions">true</item>
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                //参数: 当前Activity  共享元素(哪一个View)  transitionName
                ActivityOptionsCompat.makeSceneTransitionAnimation(this@MaterialDesignAnimActivity, it, "testTransition").apply {
                    startActivity(Intent(this@MaterialDesignAnimActivity, ToSecondActivity::class.java), this@apply.toBundle())
                }
            }
        }

        //多个元素的共享元素
        pairBtn.setOnClickListener {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                //这里还必须强转一下View
                ActivityOptionsCompat.makeSceneTransitionAnimation(this@MaterialDesignAnimActivity,
                        Pair.create(it as View, "testButton"),
                        Pair.create(imageView as View, "testTransition")).apply {
                    startActivity(Intent(this@MaterialDesignAnimActivity, ToSecondActivity::class.java), this@apply.toBundle())
                }
            }
        }

        //滑动效果
        slideBtn.setOnClickListener {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                Slide().apply {
                    duration = 1200
                    window.enterTransition = this@apply
                    window.exitTransition = this@apply
                }

                //如果有共享元素，也可以设置共享元素，那么它就会按照共享元素动画执行，其他的子view就会按照Slide动画执行。
                ActivityOptionsCompat.makeSceneTransitionAnimation(this@MaterialDesignAnimActivity).apply {
                    startActivity(Intent(this@MaterialDesignAnimActivity, ToSecondActivity::class.java), this.toBundle())
                }
            }
        }

        //爆炸效果
        explodeBtn.setOnClickListener {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                Explode().apply {
                    duration = 1200
                    //进入该页面时 的动画  (注意 设置在这里 只能是再返回的时候 展示 ,一开始进入没有这个动画 可以看下一个Activity 的写法)
                    window.enterTransition = this@apply
                    //退出下一个页面时候的动画
                    window.exitTransition = this@apply
                }

                //如果有共享元素，也可以设置共享元素，那么它就会按照共享元素动画执行，其他的子view就会按照Slide动画执行。
                ActivityOptionsCompat.makeSceneTransitionAnimation(this@MaterialDesignAnimActivity).apply {
                    startActivity(Intent(this@MaterialDesignAnimActivity, ToSecondActivity::class.java), this.toBundle())
                }
            }
        }

        //渐变效果
        fadeBtn.setOnClickListener {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                Fade().apply {
                    duration = 1200
                    window.enterTransition = this@apply
                    window.exitTransition = this@apply
                }

                //如果有共享元素，也可以设置共享元素，那么它就会按照共享元素动画执行，其他的子view就会按照Slide动画执行。
                ActivityOptionsCompat.makeSceneTransitionAnimation(this@MaterialDesignAnimActivity).apply {
                    startActivity(Intent(this@MaterialDesignAnimActivity, ToSecondActivity::class.java), this.toBundle())
                }
            }
        }
    }
}
